/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-会话管理-核心依赖
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.session.constant;

import com.taipingframework.boot.cache.redis.StandardCacheKeyBuilder;
import com.taipingframework.boot.session.properties.HttpSessionProperty;
import com.taipingframework.utility.constant.ApplicationConstant;

import java.util.concurrent.TimeUnit;

public final class SessionConstant {

    private SessionConstant() {
    }

    /**
     * Spring-Session在redis服务器存储会话对象的缓存数据过期时长(单位:秒)偏移量
     * 源码位置：
     * org.springframework.session.data.redis.RedisSessionExpirationPolicy.onExpirationUpdated(Long, Session)
     * 具体：
     * long fiveMinutesAfterExpires = sessionExpireInSeconds + TimeUnit.MINUTES.toSeconds(5);
     */
    public static final Long SPRING_SESSION_EXPIRE_OFFSET = TimeUnit.MINUTES.toSeconds(5);

    /**
     * 会话对象唯一标识(session_id)的占位符
     */
    public static final String PLACEHOLDER_SESSION_ID = "<session-id>";

    /**
     * HTTP会话对象的属性在redis中存储时使用的名称前缀
     */
    public static final String PREFIX_SESSION_ATTRIBUTE = "sessionAttr";

    /**
     * 当前会话对象在应用系统中唯一映射的登录名(账户名/用户名)
     */
    public static final String SESSION_LOGIN_KEY = "SIGN-PRINCIPAL";

    /**
     * 与统一身份认证(会话对象)相关的缓存对象分组
     */
    static final String SESSION_CACHE_KEY_GROUP;

    /**
     * (不同会话对象在相同终端)用户空间的唯一标识
     */
    public static final String MANAGED_PROFILE_KEY;

    /**
     * 终端用户空间标识在会话对象中映射的属性名
     */
    public static final String CLIENT_USER_PROFILE_KEY = "USER-PROFILE";

    /**
     * 一个登录名(账户名/用户名)最多允许登录多少台设备，默认一个登录名只能登录一台设备
     */
    public static final Integer CREDENTIALS_SIZE;

    static {
        // 与统一身份认证(会话对象)相关的缓存对象分组
        SESSION_CACHE_KEY_GROUP = StandardCacheKeyBuilder.getProperty("application.session.cache-key-group", ApplicationConstant.DEFAULT_GROUP_SESSION);

        // 用户空间的唯一标识
        MANAGED_PROFILE_KEY = StandardCacheKeyBuilder.getProperty("application.session.flag-managed-profile", ApplicationConstant.FLAG_MANAGED_PROFILE);

        // 读取配置 - 同账户最多允许登录设备的数量
        CREDENTIALS_SIZE = Integer.valueOf(StandardCacheKeyBuilder.getProperty("application.session.credentials-size",
                String.valueOf(new HttpSessionProperty().getCredentialsSize())));
    }

}
